let a: number = 1;

// 字面量类型声明（有点类似常量，比较少用）
let a1:10;
// a1=12 // 报错


// 联合类型

// 可以使用|连接多个类型
let b:"male"|"female";
b="male";
b="female"
// b="no";// 报错

// c可以是boolean或者string
let c:boolean|string;
c=true;
c="hello";



// any 任意类型，相当于给该变量关闭了类型检查（不建议使用）
let d:any;
// let d;//隐式any类型
d=10;
d='hello'

// unknown 未知类型  实际上是类型安全的any 不能赋值给其他变量
let e:unknown;
e=10;
e='hello'


let s:string;
s=d; // d的类型是any，可以赋值给任意变量

// s=e; // 报错 因为e是unknown 不能赋值给string

// 类型断言
s=e as string;
s=<string>e;

// 类型判断
if(typeof e==='string'){
    s=e;
}


// void类型  表示没有返回值的函数
function fn():void{
    console.log('void');
}

// never类型  表示不会返回任何值的函数
function fn2():never{
    throw new Error('never');
}
